﻿
#ifndef  I_DATA_H
#define I_DATA_H

#include "GnsClientCoreHead.h"

#include <string.h>  

#include <iostream>
#include <algorithm>
#include <assert.h>

#include <vector>

#include <mutex>    // std::mutex, std::lock, std::unique_lock
#include <typeinfo>  
#include "stdarg.h"    // 用省略号指定参数表

#include "GnsClientCoreHead.h"

class IDataRepository
{
public:

	enum 
	{
		ERR_pData_is_null = 10,
		ERR_iDataLen_is_0 = 20,
		ERR_dataRepository_size_is_0 = 30,	// dataRepository 里面没有元素
		ERR_dataRepository_not_find = 40,		// dataRepository 里面找不到符合条件的元素
		ERR_IS_NOT_DS_WRITE_FINISH = 45,	// 不是 DS_WRITE_FINISH 状态，不能读取
		ERR_IS_NOT_FIND = 60,							// 没找到
	};
public:
	IDataRepository();
	virtual  ~IDataRepository();

public:
	virtual bool init() = 0;

public:

	// 向数据仓库写入数据
	int writeToRepository(int iMainCode, int iSubCode, int iT3Code, MSG_VALUE::STATE state, const char*  pData, int iDataLen);

	// 向数据仓库写入状态
	int setStateToRepository(int iMainCode, int iSubCode, int iT3Code, MSG_VALUE::STATE state);

	// 从数据仓库中读取数据
	int readFromRepository(int iMainCode, int iSubCode, int iT3Code, MSG_VALUE& msgValue, bool bClearMsgValueAfterRead=true);

	// 清空数据仓库中指定 Key 的 MSG_VALUE 值
	int clearFromRepository(int iMainCode, int iSubCode, int iT3Code, bool bRemoveKey=false);

	// 清空数据仓库中所有的数据
	int clearAllData();

private:

	// 制作 Key 
	int64_t makeKey(int iMainCode, int iSubCode, int iT3Code);

	// 获得 Key
	void getKey(int64_t msgKey, int& iMainCode, int& iSubCode, int& iT3Code);

private:

	MAP_DATA_REPOSITORY	_dataRepository;		// 数据仓库
	std::recursive_mutex			_lockRepository;		// 递归互斥，锁 dataRepository 的
};

#endif